package com.yeung.swordoffer;

import java.util.regex.Pattern;

/**
 * 将一个字符串转换成一个整数(实现Integer.valueOf(string)的功能，但是string不符合数字要求时返回0)，
 * 要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0。
 */
public class 把字符串转换成整数 {
    public static void main(String[] args) {
        int i = StrToInt("123");
        System.out.println(i);
    }

    public static int StrToInt(String str) {
        if (str.equals("0") || str.length() == 0) return 0;
        //判断包不包含数字之外的其他字符
        String pattern = "^[-+]?\\d*";
        boolean matches = Pattern.matches(pattern, str);
        if (!matches) return 0;


        Long tmp = 0l;
        if (str.startsWith("-")) {
            //是个负数
            str = str.substring(1);
            tmp = -format(str.toCharArray());
        } else if (str.startsWith("+")) {
            //不是负数
            str = str.substring(1);
            tmp = format(str.toCharArray());

        } else
            tmp = format(str.toCharArray());

        return Math.toIntExact(tmp);
    }

    static long format(char[] chars) {
        int pos = chars.length - 1;
        long sum = 0;
        for (int i = 0; i < chars.length; i++) {
            long v = (long) (char2Int(chars[i]) * Math.pow(10, pos));
            sum += v;
            pos--;
        }
        return sum;
    }

    static int char2Int(char c) {
        int result = 0;
        switch (c) {
            case '1':
                result = 1;
                break;
            case '2':
                result = 2;
                break;
            case '3':
                result = 3;
                break;
            case '4':
                result = 4;
                break;
            case '5':
                result = 5;
                break;
            case '6':
                result = 6;
                break;
            case '7':
                result = 7;
                break;
            case '8':
                result = 8;
                break;
            case '9':
                result = 9;
                break;
            default:
                result = 0;
        }
        return result;
    }
}
